<?php
namespace app\admin\controller;
use think\Controller;
use think\facade\Request;
use think\facade\Config;
use think\facade\Cache;
use think\facade\Cookie;
use think\facade\Session;
use think\captcha\Captcha;
use Firebase\JWT;
use app\admin\model\AdminUser as Admin;

use think\facade\Lang;
class Login extends Controller
{
	// 设置中间件
	protected $middleware =  [ 'AdminLoginCheck', ];
	// 登陆接口参数控制
	protected $loginParam = ['username','password','captcha','keep','agreement','loginsql','oauth2','token'];
	
	/**
	 * 登陆页首页
	 * @return  返回登录页视图内容
	 */
	public function index() { return view(); }

	/**
	 * login 登陆接口
	 * @return array [code 返回码 msg 返回信息 data 返回数据]
	 */
	public function login()
	{
		// 接收post信息
		$param = $this->loginParamDispose();
		// 用户数据验证 不正确返回错误内容
		$res = $this->validate($param,'Login.login');
		if (true !== $res) return ['code'=>1,'msg'=>$res,'data'=>false];
		// 用户数据库验证，不正确返回错误内容
		$res = $this->validate($param,'Login.logindb');
		if (true !== $res) return ['code'=>1,'msg'=>$res,'data'=>false];
		// 查询用户数据并进行存储
		$data = $this->loginAction($param);
		return ['code'=>0,'msg'=>'Success','data'=>$data];
	}

	/**
	 * loginParamDispose description
	 * @return array 返回请求参数
	 */
	private function loginParamDispose()
	{
		// 接收前台传递的参数
		$param = Request::param();
		// 清理前台传入的数组
		foreach ($param as $key => $val) { if (!in_array($key, $this->loginParam)) unset($param[$key]); }
		// 返回处理后的param信息
		return $param;
	}


	/**
	 * token验证生成以及
	 * @param  array $param 用户请求的数据内容
	 * @return string       返回一串加密的token
	 */
	private function loginAction($param)
	{
		if ($param['oauth2'] == 'shut')
		{
			// 读取admin 中的用户配置信息
			$config = Config::get('admin.user');
			// 进行登录操作信息读取
			$admin = Admin::where('username','=',$param['username'])->field('password',true)->find()->toArray();
			// 记录如缓存信息中
			Cache::tag($config['tag'])->set(session_id(),$admin,$config['exp']);
			// 返回信息数据
			return ['admin'=>$admin,'access_token'=>session_id()];
		}
		else
		{
			// 获取用户Oauth2配置
			$config = Config::get('web.oauth_config');
			$nowtime = $_SERVER['REQUEST_TIME'];// 签发时间
			$admin = Admin::where('username','=',$param['username'])->field('password',true)->find()->toArray();// 签发数据（用户数据）
			$token =
			[
				'iss' => $config['issuer'], //签发者
				'sbu' => $param['username'], //jwt所面向的用户
				'aud' => $param['username'], //jwt接收用户
				'iat' => $nowtime, //签发时间
				'nbf' => $nowtime + $config['request_time'], //在什么时间之后该jwt才可用
				'exp' => $nowtime + $config['cache_time'], //过期时间 8小时
				'data' => $admin,//用户数据
				'ikv'	=>$param['token'],//防篡改token严重保护借口
			];
			// 加密token并且返回
			$jwt = JWT::encode($token, $config['token_key'],'HS256');
			//系统有注销功能加上
			Cache::tag(Config::get('admin.user.tag'))->set($token['aud'],$token['data'],$token['exp']);
			return ['admin'=>$admin,'access_token'=>$jwt];
		}
	}

	/**
	 * code 验证码图像接口 该内容直接放入 src路径链接即可
	 * @return 图形验证码
	 */
	public function code()
	{
		// 获取配置
		$config = Config::get('admin.code_config');
		// 实例化图形验证码类
		$captcha = new Captcha($config);
		// 返回图形验证
		return $captcha->entry();
	}
}
